package component

// InnerContext 请求上下文
type InnerContext interface {
	WebContext                                         // WebContext接口
	Endpoint() *EndpointMeta                           // Endpoint元数据
	Service() ServiceMeta                              // Service元数据
	Attribute(key string, def interface{}) interface{} // Attribute 获取指定key的Attribute。如果不存在，返回默认值；
	Attributes() map[string]interface{}                // Attributes 返回所有Attributes键值对；只读；
	SetAttribute(key string, value interface{})        // SetAttribute 向Context添加Attribute键值对
}

// NewContext 创建请求上下文
func NewContext(ctx WebContext, metadata *EndpointMeta) *Ctx {
	return &Ctx{
		WebContext: ctx,
		endpoint:   metadata,
		attributes: make(map[string]interface{}, 16),
	}
}

// Ctx 请求上下文
type Ctx struct {
	WebContext                        // WebContext接口
	attributes map[string]interface{} // 属性Attributes
	endpoint   *EndpointMeta          // Endpoint元数据
}

func (c *Ctx) Endpoint() *EndpointMeta {
	return c.endpoint
}

func (c *Ctx) Attribute(key string, defValue interface{}) interface{} {
	if v, ok := c.attributes[key]; ok {
		return v
	} else {
		return defValue
	}
}

func (c *Ctx) Attributes() map[string]interface{} {
	out := make(map[string]interface{}, len(c.attributes))
	for k, v := range c.attributes {
		out[k] = v
	}
	return out
}

func (c *Ctx) SetAttribute(key string, value interface{}) {
	c.attributes[key] = value
}

func (c *Ctx) Service() ServiceMeta {
	return c.endpoint.Service
}
